package SIM.dp22.Iterator;

public class DvdList {
	private String[] titles;
	// Yes, it would be easier to do this whole example with ArrayList
	// and ListIterator, but it certainly wouldn't be as much fun!
	private int titleCount;
	// title count is always a real count of titles, but one ahead of
	// itself as a subscript
	private int arraySize;

	public DvdList() {
		titles = new String[3];
		// using 3 to demonstrate array expansion more easily,
		// not for efficency
		titleCount = 0;
		arraySize = 3;
	}

	public int count() {
		return titleCount;
	}

	public void append(String titleIn) {
		if (titleCount >= arraySize) {
			String[] tempArray = new String[arraySize];
			for (int i = 0; i < arraySize; i++) {
				tempArray[i] = titles[i];
			}
			titles = null;
			arraySize = arraySize + 3;
			titles = new String[arraySize];
			for (int i = 0; i < (arraySize - 3); i++) {
				titles[i] = tempArray[i];
			}
		}
		titles[titleCount++] = titleIn;
	}

	public void delete(String titleIn) {
		boolean found = false;
		for (int i = 0; i < (titleCount - 1); i++) {
			if (found == false) {
				if (titles[i].equals(titleIn)) {
					found = true;
					titles[i] = titles[i + 1];
				}
			} else {
				if (i < (titleCount - 1)) {
					titles[i] = titles[i + 1];
				} else {
					titles[i] = null;
				}
			}
		}

		if (found == true) {
			--titleCount;
		}
	}

	public DvdListIterator createIterator() {
		return new InnerIterator();
	}

	// note:
	// This example shows the Concrete Iterator as an inner class.
	// The Iterator Pattern in GoF does allow for multiple types of
	// iterators for a given list or "Aggregate". This could be
	// accomplished with multiple Iterators in multiple inner classes.
	// The createIterator class would then have multiple variations.
	// This, however, assumes that you will have a limited number of
	// iterator variants - which is normally the case. If you do want
	// more flexibility in iterator creation, the iterators should not
	// be in inner classes, and perhaps some sort factory should be
	// employed to create them.
	//
	private class InnerIterator implements DvdListIterator {
		private int currentPosition = 0;

		private InnerIterator() {
		}

		public void first() {
			currentPosition = 0;
		}

		public void next() {
			if (currentPosition < (titleCount)) {
				++currentPosition;
			}
		}

		public boolean isDone() {
			if (currentPosition >= (titleCount)) {
				return true;
			} else {
				return false;
			}
		}

		public String currentItem() {
			return titles[currentPosition];
		}
	}
}